home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / async_tx.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  5.1 KB  |  151 lines

  1. /*
  2.  * Copyright ¬© 2006, Intel Corporation.
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify it
  5.  * under the terms and conditions of the GNU General Public License,
  6.  * version 2, as published by the Free Software Foundation.
  7.  *
  8.  * This program is distributed in the hope it will be useful, but WITHOUT
  9.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11.  * more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License along with
  14.  * this program; if not, write to the Free Software Foundation, Inc.,
  15.  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  16.  *
  17.  */
  18. #ifndef _ASYNC_TX_H_
  19. #define _ASYNC_TX_H_
  20. #include <linux/dmaengine.h>
  21. #include <linux/spinlock.h>
  22. #include <linux/interrupt.h>
  23.  
  24. /**
  25.  * dma_chan_ref - object used to manage dma channels received from the
  26.  *   dmaengine core.
  27.  * @chan - the channel being tracked
  28.  * @node - node for the channel to be placed on async_tx_master_list
  29.  * @rcu - for list_del_rcu
  30.  * @count - number of times this channel is listed in the pool
  31.  *    (for channels with multiple capabiities)
  32.  */
  33. struct dma_chan_ref {
  34.     struct dma_chan *chan;
  35.     struct list_head node;
  36.     struct rcu_head rcu;
  37.     atomic_t count;
  38. };
  39.  
  40. /**
  41.  * async_tx_flags - modifiers for the async_* calls
  42.  * @ASYNC_TX_XOR_ZERO_DST: this flag must be used for xor operations where the
  43.  * the destination address is not a source.  The asynchronous case handles this
  44.  * implicitly, the synchronous case needs to zero the destination block.
  45.  * @ASYNC_TX_XOR_DROP_DST: this flag must be used if the destination address is
  46.  * also one of the source addresses.  In the synchronous case the destination
  47.  * address is an implied source, whereas the asynchronous case it must be listed
  48.  * as a source.  The destination address must be the first address in the source
  49.  * array.
  50.  * @ASYNC_TX_ACK: immediately ack the descriptor, precludes setting up a
  51.  * dependency chain
  52.  * @ASYNC_TX_DEP_ACK: ack the dependency descriptor.  Useful for chaining.
  53.  */
  54. enum async_tx_flags {
  55.     ASYNC_TX_XOR_ZERO_DST     = (1 << 0),
  56.     ASYNC_TX_XOR_DROP_DST     = (1 << 1),
  57.     ASYNC_TX_ACK         = (1 << 3),
  58.     ASYNC_TX_DEP_ACK     = (1 << 4),
  59. };
  60.  
  61. #ifdef CONFIG_DMA_ENGINE
  62. void async_tx_issue_pending_all(void);
  63. enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx);
  64. void async_tx_run_dependencies(struct dma_async_tx_descriptor *tx);
  65. #ifdef CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL
  66. #include <asm/async_tx.h>
  67. #else
  68. #define async_tx_find_channel(dep, type, dst, dst_count, src, src_count, len) \
  69.      __async_tx_find_channel(dep, type)
  70. struct dma_chan *
  71. __async_tx_find_channel(struct dma_async_tx_descriptor *depend_tx,
  72.     enum dma_transaction_type tx_type);
  73. #endif /* CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL */
  74. #else
  75. static inline void async_tx_issue_pending_all(void)
  76. {
  77.     do { } while (0);
  78. }
  79.  
  80. static inline enum dma_status
  81. dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx)
  82. {
  83.     return DMA_SUCCESS;
  84. }
  85.  
  86. static inline void
  87. async_tx_run_dependencies(struct dma_async_tx_descriptor *tx,
  88.     struct dma_chan *host_chan)
  89. {
  90.     do { } while (0);
  91. }
  92.  
  93. static inline struct dma_chan *
  94. async_tx_find_channel(struct dma_async_tx_descriptor *depend_tx,
  95.     enum dma_transaction_type tx_type, struct page **dst, int dst_count,
  96.     struct page **src, int src_count, size_t len)
  97. {
  98.     return NULL;
  99. }
  100. #endif
  101.  
  102. /**
  103.  * async_tx_sync_epilog - actions to take if an operation is run synchronously
  104.  * @cb_fn: function to call when the transaction completes
  105.  * @cb_fn_param: parameter to pass to the callback routine
  106.  */
  107. static inline void
  108. async_tx_sync_epilog(dma_async_tx_callback cb_fn, void *cb_fn_param)
  109. {
  110.     if (cb_fn)
  111.         cb_fn(cb_fn_param);
  112. }
  113.  
  114. void
  115. async_tx_submit(struct dma_chan *chan, struct dma_async_tx_descriptor *tx,
  116.     enum async_tx_flags flags, struct dma_async_tx_descriptor *depend_tx,
  117.     dma_async_tx_callback cb_fn, void *cb_fn_param);
  118.  
  119. struct dma_async_tx_descriptor *
  120. async_xor(struct page *dest, struct page **src_list, unsigned int offset,
  121.     int src_cnt, size_t len, enum async_tx_flags flags,
  122.     struct dma_async_tx_descriptor *depend_tx,
  123.     dma_async_tx_callback cb_fn, void *cb_fn_param);
  124.  
  125. struct dma_async_tx_descriptor *
  126. async_xor_zero_sum(struct page *dest, struct page **src_list,
  127.     unsigned int offset, int src_cnt, size_t len,
  128.     u32 *result, enum async_tx_flags flags,
  129.     struct dma_async_tx_descriptor *depend_tx,
  130.     dma_async_tx_callback cb_fn, void *cb_fn_param);
  131.  
  132. struct dma_async_tx_descriptor *
  133. async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset,
  134.     unsigned int src_offset, size_t len, enum async_tx_flags flags,
  135.     struct dma_async_tx_descriptor *depend_tx,
  136.     dma_async_tx_callback cb_fn, void *cb_fn_param);
  137.  
  138. struct dma_async_tx_descriptor *
  139. async_memset(struct page *dest, int val, unsigned int offset,
  140.     size_t len, enum async_tx_flags flags,
  141.     struct dma_async_tx_descriptor *depend_tx,
  142.     dma_async_tx_callback cb_fn, void *cb_fn_param);
  143.  
  144. struct dma_async_tx_descriptor *
  145. async_trigger_callback(enum async_tx_flags flags,
  146.     struct dma_async_tx_descriptor *depend_tx,
  147.     dma_async_tx_callback cb_fn, void *cb_fn_param);
  148.  
  149. void async_tx_quiesce(struct dma_async_tx_descriptor **tx);
  150. #endif /* _ASYNC_TX_H_ */
  151.